package com.game.league.entrance.user;

import com.game.base.observe.MsgMgr;
import com.game.base.observe.MsgType;
import com.game.base.utils.log.Logger;
import com.game.base.utils.toast.ToastUtil;
import com.game.league.entrance.user.table.User;

import org.json.JSONObject;

import java.util.List;

import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FetchUserInfoListener;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.LogInListener;
import cn.bmob.v3.listener.SaveListener;
import cn.bmob.v3.listener.UpdateListener;

/**
 * 用户系统 - 注册登录管理 [http://doc.bmob.cn/data/android/develop_doc/#22]
 * <p>
 * 用户系统的邮箱操作[http://doc.bmob.cn/data/android/develop_doc/#23]
 * <p>
 * 用户系统的手机号操作[http://doc.bmob.cn/data/android/develop_doc/#24]
 * <p>
 * 用户系统的第三方操作[http://doc.bmob.cn/data/android/develop_doc/#25]
 */
public class UserMgr {

    // ===================================== 普通注册登录 ======================================

    /**
     * 账号密码注册
     */
    public static void signUp(String userName, String password) {
        final User user = new User();
        user.setUsername(userName);
        user.setPassword(password);
        user.setAge(18);
        user.signUp(new SaveListener<User>() {
            @Override
            public void done(User user, BmobException e) {
                if (e == null) {  // 注册成功
                } else {
                }
            }
        });
    }

    /**
     * 账号密码登录
     */
    public static void login(String userName, String password) {
        BmobUser.loginByAccount(userName, password, new LogInListener<User>() {
            @Override
            public void done(User user, BmobException e) {
                if (e == null) {
                } else {
                }
            }
        });
    }

    /**
     * 退出登录，同时清除缓存的用户对象
     */
    public static void logOut() {
        BmobUser.logOut();
    }

    // ===================================== 三方注册登录 ======================================

    /**
     * 一键注册登录： 自行构造BmobThirdUserAuth
     *
     * @param snsType     固定值：weibo 或 qq 或 weixin
     * @param accessToken 接口调用凭证，由第三方平台返回取得
     * @param expiresIn   access_token的有效时间，由第三方平台返回取得
     * @param userId      用户身份的唯一标识，由第三方平台返回取得，对应微博授权信息中的uid，对应qq和微信授权信息中的openid
     */
    public static void thirdSignUpLogin(String snsType, String accessToken, String expiresIn, String userId,
                                        LogInListener<JSONObject> listener) {
        BmobUser.BmobThirdUserAuth authInfo = new BmobUser.BmobThirdUserAuth(snsType, accessToken, expiresIn, userId);
        BmobUser.loginWithAuthData(authInfo, listener);
    }

    /**
     * 关联三方账号
     */
    public static void associate(String snsType, String accessToken, String expiresIn, String userId) {
        BmobUser.BmobThirdUserAuth authInfo = new BmobUser.BmobThirdUserAuth(snsType, accessToken, expiresIn, userId);
        BmobUser.associateWithAuthData(authInfo, new UpdateListener() {
            @Override
            public void done(BmobException e) {
                ToastUtil.showShort(e == null ? "关联成功" : "关联失败");
            }
        });
    }

    /**
     * 解除三方账号关联
     */
    public static void unAssociate(String snsType) {
        BmobUser.dissociateAuthData(snsType, new UpdateListener() {
            @Override
            public void done(BmobException e) {
                ToastUtil.showShort(e == null ? "解绑成功" : e.getErrorCode() == 208 ? "你没有关联该账号" : "解绑失败");
            }
        });
    }

    // ===================================== 数据操作 ======================================

    /**
     * 当前是否登录状态
     */
    public static boolean isLogin() {
        return BmobUser.isLogin();
    }

    /**
     * 获取当前用户
     */
    public static User getCurrentUser() {
        if (BmobUser.isLogin()) {
            return BmobUser.getCurrentUser(User.class);
        }
        Logger.d("尚未登录，请先登录");
        return new User();
    }

    /**
     * 获取昵称：  根据Key获取具体值: key = User.java中定义的变量
     */
    public static String getUserName() {
        return (String) BmobUser.getObjectByKey("username");
    }

    /**
     * 更新用户本地缓存信息
     */
    public static void fetchUserInfo() {
        BmobUser.fetchUserInfo(new FetchUserInfoListener<BmobUser>() {
            @Override
            public void done(BmobUser user, BmobException e) {
                if (e == null) {
                    Logger.d("更新用户本地缓存成功");
                } else {
                    Logger.printThrowable(e);
                }
            }
        });
    }

    /**
     * 获取控制台最新 Json 数据， 不会同步到缓存中
     */
    public static void fetchUserJsonInfo() {
        BmobUser.fetchUserJsonInfo(new FetchUserInfoListener<String>() {
            @Override
            public void done(String json, BmobException e) {
                if (e == null) {
                    Logger.d("获取控制台最新数据成功: " + json);
                } else {
                    Logger.printThrowable(e);
                }
            }
        });
    }

    /**
     * 更新用户信息
     */
    public static void updateUser(User user) {
        updateUser(user, null);
    }

    public static void updateUser(User user, UpdateListener listener) {
        user.update(new UpdateListener() {
            @Override
            public void done(BmobException e) {
                if (e == null) {
                    MsgMgr.getInstance().sendMsg(MsgType.MT_Update_Info);
                    Logger.d("更新用户信息成功");
                } else {
                    Logger.printThrowable(e);
                }
                if (listener != null) {
                    listener.done(e);
                }
            }
        });
    }


    /**
     * 查询用户信息
     */
    public static void queryUser() {
        BmobQuery<User> bmobQuery = new BmobQuery<>();
        bmobQuery.findObjects(new FindListener<User>() {
            @Override
            public void done(List<User> object, BmobException e) {
                if (e == null) {
                } else {
                }
            }
        });
    }

    /**
     * 修改密码, 用户是登录状态
     */
    public static void updatePassword(String oldPwd, String newPwd) {
        BmobUser.updateCurrentUserPassword(oldPwd, newPwd, new UpdateListener() {
            @Override
            public void done(BmobException e) {
                ToastUtil.showShort(e == null ? "修改成功" : "修改失败，稍候重试");
            }
        });
    }
}
